package thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Thread-9--CallableDemo线程开始执行
 * Thread-8--CallableDemo线程开始执行
 * Thread-7--CallableDemo线程开始执行
 * Thread-6--CallableDemo线程开始执行
 * Thread-5--CallableDemo线程开始执行
 * Thread-4--CallableDemo线程开始执行
 * Thread-3--CallableDemo线程开始执行
 * Thread-1--CallableDemo线程开始执行
 * Thread-0--CallableDemo线程开始执行
 * Thread-2--CallableDemo线程开始执行
 * Thread-2--CallableDemo线程执行完成
 * Thread-4--CallableDemo线程执行完成
 * Thread-0--CallableDemo线程执行完成
 * success
 * Thread-3--CallableDemo线程执行完成
 * Thread-1--CallableDemo线程执行完成
 * success
 * success
 * success
 * success
 * Thread-9--CallableDemo线程执行完成
 * Thread-8--CallableDemo线程执行完成
 * Thread-7--CallableDemo线程执行完成
 * Thread-5--CallableDemo线程执行完成
 * Thread-6--CallableDemo线程执行完成
 * success
 * success
 * success
 * success
 * success
 *
 * 1.实现Callable接口，实现call方法线程方法体
 * 2.创建Callable实现类的实例，以其作为参数创建FutureTask
 * 3.以FutureTask的实例为参数创建Thread实例，调用start方法即可执行
 * 注意：FutureTask是有返回值的
 */
public class CallableDemo implements Callable<String> {

    public static void main(String[] args) {
        List<FutureTask<String>> tasks = new ArrayList<>();
        for (int i=0; i<10; i++) {
            CallableDemo callableDemo = new CallableDemo();
            FutureTask<String> task = new FutureTask<>(callableDemo);
            new Thread(task).start();
            tasks.add(task);
        }
        tasks.forEach(task->{
            String s = null;
            try {
                s = task.get();
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
            System.out.println(s);
        });
    }

    @Override
    public String call() {
        System.out.println(Thread.currentThread().getName() + "--CallableDemo线程开始执行");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "--CallableDemo线程执行完成");
        return "success";
    }
}
